import axios from '../lib/axios.min.js'
import util from './util/util.js'

// 记录和显示错误
function errorLog(err) {
    // 打印到控制台
    util.log.error('>>>>>> Error >>>>>>')
    util.log.default(err)
}

// 创建一个 axios 实例
const service = axios.create({
    timeout: 60000 // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
    config => {
        // 在请求发送之前做一些处理
        const result = util.queryUrlParams(location.href)
        let token = util.isNotEmpty(result) && result['token'] !== 'undefined' ? result['token'] : ''
        let projId = util.isNotEmpty(result) && result['projId'] !== 'undefined' ? result['projId'] : ''
        // token='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOiIxNzI0ODE2MjM4IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6ImFkbWluIiwiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2NsYWltcy9yb2xlIjoiYWRtaW5pc3RyYXRvcnMiLCJMb2dpblR5cGUiOiJBY2NvdW50UHdkIiwiQ2xpZW50VHlwZSI6IldlYlNlcnZlciIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL3NpZCI6ImRjMGM1ZiIsImV4cCI6MTcyNDgyMzQzOCwiaXNzIjoid3d3LmlvdGh1Yi5saW5rIiwiYXVkIjoid3d3LmlvdGh1Yi5saW5rIn0.tpp1qKnK_PO1-UQ_TdEb_sFocDZHsdVIu9QvEBTaDMQ'
        // projId='78dea089a5975cf6'
        if(!token){
            token = Fuck('func_db', null, 'get', JSON.stringify({ key: 'web_token', default: '' }))
            projId = Fuck('func_db', null, 'get', JSON.stringify({ key: 'web_projId', default: '' }))
        }
        // 在请求发送之前做一些处理
        // 让每个请求携带token
        config.headers.Authorization = 'Bearer ' + token
        config.headers.projId = projId
        return config
    },
    error => {
        // 发送失败
        util.log.error(error)
        Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(
    response => {
        // dataAxios 是 axios 返回数据中的 data
        const dataAxios = util.objToLowerCase(response.data)
        // 这个状态码是和后端约定的
        const { code } = dataAxios
        // 根据 code 进行判断
        if (typeof code === 'undefined') {
            // 如果没有 code 代表这不是项目后端开发的接口
            return dataAxios
        } else {
            // 有 code 代表这是一个后端接口 可以进行进一步的判断
            if (code === 0) {
                // [ 示例 ] code === 0 代表没有错误
                return dataAxios
            } else {
                // 不是正确的 code
                // errorCreate(`${dataAxios.msg}`);
                if (!dataAxios.Msg) {
                    dataAxios.Msg = dataAxios.msg
                }
                return dataAxios
            }
        }
    },
    error => {
        if (error && error.response) {
            switch (error.response.status) {
                case 400:
                    error.message = '请求错误'
                    break
                case 401:
                    error.message = '未授权，请重新登录'
                    //   router.push({ name: 'exception', query: { type: '401', desc: '未授权，请重新登录' } });
                    
                    break
                case 403:
                    error.message = '无权限或授权过期，拒绝访问，请重新登录'
                    break
                case 404:
                    error.message = `请求地址出错: ${error.response.config.url}`
                    break
                case 408:
                    error.message = '请求超时'
                    break
                case 500:
                    error.message = '服务器内部错误'
                    //   router.push({ name: 'exception500' });
                    break
                case 501:
                    error.message = '服务未实现'
                    break
                case 502:
                    error.message = '网关错误'
                    break
                case 503:
                    error.message = '服务不可用'
                    break
                case 504:
                    error.message = '网关超时'
                    break
                case 505:
                    error.message = 'HTTP版本不受支持'
                    break
                default:
                    break
            }
        }
        errorLog(error)
        return Promise.reject(error)
    }
)

export default service
